from collections.abc import Iterable

# 可迭代的对象 1。生成器 2。元祖 列表  集合 字典 字符串
# 如何判断一个对象是否是可迭代的？


list1 = [1, 2, 4, 6, 45, 9]

f = isinstance(list1, Iterable)
"""
   Return whether an object is an instance of a class or of a subclass thereof.

   A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
   check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
   or ...`` etc.
"""

print(f)

"""
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象，
迭代器对象从集合的第一个元素开始访问，知道所有元素被访问完结束。
pthhon迭代器只能往前不会后退，
[1,2,3,4,5,6]
可以被next()函数调用并不断返回下一个值的对象称为迭代器； Iterator
"""

# next(list1)

# Traceback (most recent call last):
#   File "/Users/liangbo/PycharmProjects/untitled/chapter04/GenetatorTest002.py", line 28, in <module>
#     next(list1)
# TypeError: 'list' object is not an iterator

print(type(list1))  # <class 'list'>
list1 = iter(list1)  # <class 'list_iterator'>
print(type(list1))

"""
复习：列表推导式
[表达式 for 变量 in 列表]
[x+2 for x in list1]

1.[表达式  for 变量 in  列表  if 表达式]
    [x + 2 for  x in list1 if x%2==0]
    
2.[结果A if 条件 else 结果B for x in  list1]
    [x +2 if x%2==0 else x+1 for x in  list1]
    
    
集合推导式： {表达式 for  变量 in 列表}
字典推导式： {key,value for k,v in 字典.item()}

生成器: Generator

1.使用类似 的列表推导式 g=(表达式 for 变量 in 列表)
    g 就是生成器

2。 函数 ---  yield    

    def func():
        .....
        yield
        .....
    
    g=func()
    
得到里面的元素：
    系统函数 ：next(g)
    生成器里的函数：__next__()   [send(None) ,send(e)]    
    
可迭代的 与 迭代器：
    1，生成器  2，字符串/列表/集合
    
Iterable

isinstance(x,Iterable)  ----> True,False


生成器就是一个迭代器  ---》 next(g)     下一个元素
next(list)  iter(list)   next(iter(list))




    
"""
